package com.gitee.qdbp.general.common.api.oplog.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.gitee.qdbp.able.jdbc.paging.PartList;
import com.gitee.qdbp.base.annotation.DataIsolation;
import com.gitee.qdbp.base.annotation.OperateTraces;

/**
 * 访问日志实体类
 *
 * @author zhh
 * @version 171129
 */
@OperateTraces(id = "id")
@DataIsolation(enable = false)
public class AccessRecordBean implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 表名 **/
    public static final String TABLE = "sys_access_record";

    /** 主键 **/
    private String id;

    /** 租户编号 **/
    private String tenantCode;

    /** 用户ID **/
    private String userId;

    /** 用户名 **/
    private String userName;

    /** IP **/
    private String ip;

    /** 城市 **/
    private String city;

    /** 请求协议 **/
    private String requestProtocol;

    /** 请求URL **/
    private String requestUrl;

    /** 请求参数 **/
    private String requestParams;

    /** 请求描述 **/
    private String requestDesc;

    /** 来源页 **/
    private String refererUrl;

    /** 入口 **/
    private Boolean entrance;

    /** 来源类型 **/
    private String refererType;

    /** 来源关键词 **/
    private String refererKeyword;

    /** UserAgent **/
    private String userAgent;

    /** 浏览器类型 **/
    private String browserType;

    /** 浏览器版本 **/
    private String browserVersion;

    /** 操作系统类型 **/
    private String osType;

    /** 操作系统版本 **/
    private String osVersion;

    /** 设备类型 **/
    private String deviceType;

    /** 创建时间 **/
    private Date createTime;

    /** 选项 **/
    private AccessRecordOptions options;

    /** 获取主键 **/
    public String getId() {
        return id;
    }

    /** 设置主键 **/
    public void setId(String id) {
        this.id = id;
    }

    /** 获取租户编号 **/
    public String getTenantCode() {
        return tenantCode;
    }

    /** 设置租户编号 **/
    public void setTenantCode(String tenantCode) {
        this.tenantCode = tenantCode;
    }

    /** 获取用户ID **/
    public String getUserId() {
        return userId;
    }

    /** 设置用户ID **/
    public void setUserId(String userId) {
        this.userId = userId;
    }

    /** 获取用户名 **/
    public String getUserName() {
        return userName;
    }

    /** 设置用户名 **/
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /** 获取IP **/
    public String getIp() {
        return ip;
    }

    /** 设置IP **/
    public void setIp(String ip) {
        this.ip = ip;
    }

    /** 获取城市 **/
    public String getCity() {
        return city;
    }

    /** 设置城市 **/
    public void setCity(String city) {
        this.city = city;
    }

    /** 获取请求协议 **/
    public String getRequestProtocol() {
        return requestProtocol;
    }

    /** 设置请求协议 **/
    public void setRequestProtocol(String requestProtocol) {
        this.requestProtocol = requestProtocol;
    }

    /** 获取请求URL **/
    public String getRequestUrl() {
        return requestUrl;
    }

    /** 设置请求URL **/
    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    /** 获取请求参数 **/
    public String getRequestParams() {
        return requestParams;
    }

    /** 设置请求参数 **/
    public void setRequestParams(String requestParams) {
        this.requestParams = requestParams;
    }

    /** 获取请求描述 **/
    public String getRequestDesc() {
        return requestDesc;
    }

    /** 设置请求描述 **/
    public void setRequestDesc(String requestDesc) {
        this.requestDesc = requestDesc;
    }

    /** 获取来源页 **/
    public String getRefererUrl() {
        return refererUrl;
    }

    /** 设置来源页 **/
    public void setRefererUrl(String refererUrl) {
        this.refererUrl = refererUrl;
    }

    /** 获取入口 **/
    public Boolean getEntrance() {
        return entrance;
    }

    /** 设置入口 **/
    public void setEntrance(Boolean entrance) {
        this.entrance = entrance;
    }

    /** 获取来源类型 **/
    public String getRefererType() {
        return refererType;
    }

    /** 设置来源类型 **/
    public void setRefererType(String refererType) {
        this.refererType = refererType;
    }

    /** 获取来源关键词 **/
    public String getRefererKeyword() {
        return refererKeyword;
    }

    /** 设置来源关键词 **/
    public void setRefererKeyword(String refererKeyword) {
        this.refererKeyword = refererKeyword;
    }

    /** 获取UserAgent **/
    public String getUserAgent() {
        return userAgent;
    }

    /** 设置UserAgent **/
    public void setUserAgent(String userAgent) {
        this.userAgent = userAgent;
    }

    /** 获取浏览器类型 **/
    public String getBrowserType() {
        return browserType;
    }

    /** 设置浏览器类型 **/
    public void setBrowserType(String browserType) {
        this.browserType = browserType;
    }

    /** 获取浏览器版本 **/
    public String getBrowserVersion() {
        return browserVersion;
    }

    /** 设置浏览器版本 **/
    public void setBrowserVersion(String browserVersion) {
        this.browserVersion = browserVersion;
    }

    /** 获取操作系统类型 **/
    public String getOsType() {
        return osType;
    }

    /** 设置操作系统类型 **/
    public void setOsType(String osType) {
        this.osType = osType;
    }

    /** 获取操作系统版本 **/
    public String getOsVersion() {
        return osVersion;
    }

    /** 设置操作系统版本 **/
    public void setOsVersion(String osVersion) {
        this.osVersion = osVersion;
    }

    /** 获取设备类型 **/
    public String getDeviceType() {
        return deviceType;
    }

    /** 设置设备类型 **/
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }

    /** 获取创建时间 **/
    public Date getCreateTime() {
        return createTime;
    }

    /** 设置创建时间 **/
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /** 获取选项 **/
    public AccessRecordOptions getOptions() {
        return options;
    }

    /** 获取选项, force=是否强制返回非空对象 **/
    public AccessRecordOptions getOptions(boolean force) {
        if (options == null && force) {
            options = new AccessRecordOptions();
        }
        return options;
    }

    /** 设置选项 **/
    public void setOptions(AccessRecordOptions options) {
        this.options = options;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends AccessRecordBean> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setId(this.getId()); // 主键
        instance.setTenantCode(this.getTenantCode()); // 租户编号
        instance.setUserId(this.getUserId()); // 用户ID
        instance.setUserName(this.getUserName()); // 用户名
        instance.setIp(this.getIp()); // IP
        instance.setCity(this.getCity()); // 城市
        instance.setRequestProtocol(this.getRequestProtocol()); // 请求协议
        instance.setRequestUrl(this.getRequestUrl()); // 请求URL
        instance.setRequestParams(this.getRequestParams()); // 请求参数
        instance.setRequestDesc(this.getRequestDesc()); // 请求描述
        instance.setRefererUrl(this.getRefererUrl()); // 来源页
        instance.setEntrance(this.getEntrance()); // 入口
        instance.setRefererType(this.getRefererType()); // 来源类型
        instance.setRefererKeyword(this.getRefererKeyword()); // 来源关键词
        instance.setUserAgent(this.getUserAgent()); // UserAgent
        instance.setBrowserType(this.getBrowserType()); // 浏览器类型
        instance.setBrowserVersion(this.getBrowserVersion()); // 浏览器版本
        instance.setOsType(this.getOsType()); // 操作系统类型
        instance.setOsVersion(this.getOsVersion()); // 操作系统版本
        instance.setDeviceType(this.getDeviceType()); // 设备类型
        instance.setCreateTime(this.getCreateTime()); // 创建时间
        instance.setOptions(this.getOptions()); // 选项
        return instance;
    }

    /**
     * 将AccessRecordBean转换为子类对象
     *
     * @param beans 待转换的对象列表
     * @param clazz 目标类型
     * @param <T> AccessRecordBean或子类
     * @param <C> T的子类
     * @return 目标对象列表
     */
    public static <T extends AccessRecordBean, C extends T> List<C> to(List<T> beans, Class<C> clazz) {
        if (beans == null) {
            return null;
        }
        List<C> list;
        if (beans instanceof PartList) {
            PartList<C> partlist = new PartList<>();
            partlist.setTotal(((PartList<?>) beans).getTotal());
            list = partlist;
        } else {
            list = new ArrayList<>();
        }
        for (AccessRecordBean bean : beans) {
            list.add(bean.to(clazz));
        }
        return list;
    }

}